package org.example;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.util.Date;

public class JwtDemo {

    /**
     JWTVerifier通常包含以下常用方法：

     verify(String token)：验证给定的JWT是否有效，如果签名验证成功，则返回其载荷（payload）。

     withIssuer(String issuer)：指定JWT的发行者（issuer），以确保该JWT只能由特定的发行者签发。

     withSubject(String subject)：指定JWT的主题（subject），以确保该JWT只能用于特定的目的或场景。

     withAudience(String... audience)：指定JWT的受众（audience），以确保该JWT只能被特定的受众使用。

     withClaim(String name, Object value)：添加自定义声明（claim）到JWT的载荷中，以便在验证时使用。

     build()：构建JWTVerifier的实例，用于验证JWT签名的有效性。这些方法可以帮助开发人员构建和配置JWTVerifier，以确保验证JWT的安全性和准确性。使用JWTVerifier时，可以根据具体的需求选择使用其中的一些或全部方法。

     JWT（JSON Web Token）通常包含以下常用方法：

     create()：创建一个新的JWT。

     withIssuer(String issuer)：设置JWT的发行者（issuer）。

     withSubject(String subject)：设置JWT的主题（subject）。

     withAudience(String... audience)：设置JWT的受众（audience）。

     withExpiresAt(Date expiresAt)：设置JWT的过期时间。

     withNotBefore(Date notBefore)：设置JWT的生效时间。

     withIssuedAt(Date issuedAt)：设置JWT的发行时间。

     withClaim(String name, Object value)：添加自定义声明（claim）到JWT的载荷中。

     sign(Algorithm algorithm)：使用指定的算法对JWT进行签名。

     verify(Algorithm algorithm)：使用指定的算法验证JWT的签名是否有效。这些方法可以帮助开发人员创建和配置JWT，并验证其有效性和真实性。使用JWT时，可以根据具体的需求选择使用其中的一些或全部方法。
     ————————————————

     版权声明：本文为博主原创文章，遵循 CC 4.0 BY-SA 版权协议，转载请附上原文出处链接和本声明。

     原文链接：https://blog.csdn.net/mingzq123/article/details/129790782
     */
    public static void main(String[] main) {
        String token ="";
        try {
            //创建加密算法
            Algorithm algorithm = Algorithm.HMAC256("secret");

            token = JWT.create()
                    //签发者
                    .withIssuer("auth0")
                    //自定义KV
                    .withClaim("admin", "jack")
                    //过期时间,必须大于签发时间
                    .withExpiresAt(new Date(System.currentTimeMillis() + 10 * 60 * 1000))
                    //生效时间,定义在什么时间之前,该Token都是不可用的
                    .withNotBefore(new Date())
                    //签发时间,一般为当前时间
                    .withIssuedAt(new Date())
                    .sign(algorithm);
            System.out.println(token);
        } catch (Exception exception){
            //Invalid Signing configuration / Couldn't convert Claims.
        }
        //token="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYmYiOjE3MzI2ODg0MzMsImlzcyI6ImF1dGgwIiwiYWRtaW4iOiJqYWNrIiwiZXhwIjoxNzMyNjg5MDMzLCJpYXQiOjE3MzI2ODg0MzN9.EqS02d8isMPor3zyHPSWZA1hmEuzRcVnpz_42tOZyeo";
        try {
            //创建加密算法
            Algorithm algorithm = Algorithm.HMAC256("secret");
            JWTVerifier verifier = JWT.require(algorithm)
              //可以强制判断token当中是否包含此字段
                    .withIssuer("auth0")
                    .withClaim("admin", "jack")
                    //单位秒: 可以接受过期的时间长度,
                    //比如过期时间为15:30:00,可以往后延45秒，那么过期时间为15:30:45
                    .acceptExpiresAt(45)
 
                    //单位秒：可以接受提前使用的时间长度，
                    //比如NotBefore定以为15:30:00，那么在到时间之前正常token都不可用
                    //设置为60，代表提前一分钟可以用  那么token在15:29:00就可以用了
                    .acceptNotBefore(60)
                    .build();
            DecodedJWT jwt = verifier.verify(token);
            System.out.println(jwt.getClaim("admin").asString());
            System.out.println(jwt.getExpiresAt());
            System.out.println(jwt.getIssuedAt());
        } catch (Exception exception){
            //Invalid signature/claims
            exception.printStackTrace();
        }
    }
}